#ifndef MEMMANAGER_H
#define MEMMANAGER_H

//#include "kernel.h"
#include "bitmap.h"
#include "translate.h"
//#include "timer.h"
#include "openfile.h"

// Arbitrary number:
#define NumSwapPages 4096
//#define BUFFERSIZE   5

class Semaphore;
class Lock;

void PageTimer( int arg );
enum REPLACEMENT_POLICY { ESC, LRU, LFU };

class MemManager {
  public:
//    MemManager( int pbuffer, int hbits );
    MemManager();
    ~MemManager();

  ///////////////////////////////////////////////////////////////////
  // implemented in testcase.cc
  ///////////////////////////////////////////////////////////////////
  void display(void);  

  ///////////////////////////////////////////////////////////////////
  // Total memory in pages (includes swap pages)
  ///////////////////////////////////////////////////////////////////
  unsigned int memAvail();       // how much memory is free (in pages)

  ///////////////////////////////////////////////////////////////////
  // mark the first free page and return its index, or return -1
  // if no page is free
  ///////////////////////////////////////////////////////////////////
  int locateFirst();    
                          
  
  ///////////////////////////////////////////////////////////////////
  // This will be invoked in AddrSpace destructor  by a dying 
  // process.  Hence it must free up all memory (physical + swap)
  ///////////////////////////////////////////////////////////////////
  void clear(TranslationEntry *pageTable, int numPages); // clear everything

  ///////////////////////////////////////////////////////////////////
  // move a page from physical memory to swap
  ///////////////////////////////////////////////////////////////////
  void pageOut(int physFrame);

  ///////////////////////////////////////////////////////////////////
  // move a page from swap to physical memory
  ///////////////////////////////////////////////////////////////////
  void pageIn(TranslationEntry *PTEntry, int physFrame);

  ///////////////////////////////////////////////////////////////////
  // Implements page buffering policy. Uses pagein and page out.
  ///////////////////////////////////////////////////////////////////
  void faultIn(TranslationEntry *PTEntry);

  void PageFaultExceptionHandler(int BadVPage);

  ///////////////////////////////////////////////////////////////////
  // Implements history recording.
  // Called only from an interrupt timer during LRU policy.
  ///////////////////////////////////////////////////////////////////
  void RecordHistory( int arg );

  private:

  int *pageBuffer;
  Bitmap *coreFreeMap,*swapFreeMap,*swapValidMap;
  TranslationEntry **coreOwners,**swapOwners;
  OpenFile *swapfile;
  Semaphore *mutex;
  Lock *test;
  int buffersize;

  ///////////////////////////////////////////////////////////////////
  // Make a free frame by using the appropriate algorithm
  ///////////////////////////////////////////////////////////////////
  int makeFreeFrame();
  int swapSearch( TranslationEntry *PTEntry );
};
#endif // MEMMANAGER_H
